#include "D:\MyCode\cpp-basic-practice\MultiRelationalMessageFolder\Message.h"
#include "D:\MyCode\cpp-basic-practice\MultiRelationalMessageFolder\Folder.h"

//将当前消息添加到指定的Folder中
void Message::add_to_Folders(const Message &m) {
    for (auto f : m.folders) { //将当前消息添加到指定的Folder中
        f->addMsg(this); //将当前消息添加到指定的Folder中
    }
}  
//将当前消息从指定的Folder中移除
void Message::remove_from_Folders() {
    for (auto f : folders) { //将当前消息从指定的Folder中移除
        f->remMsg(this); //将当前消息从指定的Folder中移除
    }
}
void Message::save(Folder &f){
    folders.insert(&f); //将当前消息添加到指定的Folder中
    f.addMsg(this); //将当前消息添加到指定的Folder中
}

void Message::remove(Folder &f){
    folders.erase(&f); //将当前消息从指定的Folder中移除
    f.remMsg(this); //将当前消息从指定的Folder中移除
}

Message::Message(const Message &m) : contents(m.contents), folders(m.folders) { //拷贝构造函数
    add_to_Folders(m); //将当前消息添加到指定的Folder中
}

//赋值运算符
Message& Message::operator=(const Message &rhs){ 
    if (this != &rhs) {
        for (auto f : folders) {
            f->remMsg(this);
        }
        contents = rhs.contents;
        folders.clear();
        for (auto f : rhs.folders) {
            f->addMsg(this);
            folders.insert(f);
        }
    }
    return *this;
}
//析构函数
Message::~Message(){ 
    remove_from_Folders(); //将当前消息从指定的Folder中移除
}
//交换两个Message对象的内容
void Message::swap(Message &lhs, Message &rhs){
    using std::swap; //引入swap函数
    for (auto f : lhs.folders) { //将当前消息从指定的Folder中移除
        f->remMsg(&lhs); //将当前消息从指定的Folder中移除
    }
    for (auto f : rhs.folders) { //将当前消息从指定的Folder中移除
        f->remMsg(&rhs); //将当前消息从指定的Folder中移除
    }
    swap(lhs.contents, rhs.contents); //交换两个Message对象的文本内容
    swap(lhs.folders, rhs.folders); //交换两个Message对象的Folder集合
    for (auto f : lhs.folders) { //将当前消息添加到指定的Folder中
        f->addMsg(&lhs); //将当前消息添加到指定的Folder中
    }
    for (auto f : rhs.folders) { //将当前消息从指定的Folder中移除
        f->addMsg(&rhs); //将当前消息从指定的Folder中移除
    }
}